package com.itheima.controller;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.PutObjectRequest;
import com.itheima.common.R;

import com.itheima.pojo.AliOssProperties;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

@RestController
@RequestMapping("/common")
public class CommonController {
//  通配符指定一个基本的路径
    @Value("${reggie.path}")
    //设定一个路径对象
    private String basePath;
//  上传文件
//    @PostMapping("/upload")
//    public R<String> upload(MultipartFile file){
////          获取原始路径名
//        String filename = file.getOriginalFilename();
////          通过原始路径进行切割 条件是根据“.”切，切出最后的索引
//        String s = filename.substring(filename.lastIndexOf("."));
////          UUID随机生成一串字符串  +切割出来的后缀名=新的图片名字
//        String id=UUID.randomUUID().toString()+s;
////          新建一个文件夹对应的是前面的基本路径
//        File file1 = new File(basePath);
////          判断  如果文件夹不存在
//        if (!file1.exists()){
//            //创建一个基本路径的文件夹
//            file1.mkdir();
//        }
//
//        try {
//            //将临时文件转移到新的文件夹中
//            file.transferTo(new File(basePath+id));
//            //如果有编译时异常就进行抛出
//        }catch (IOException e){
//            e.printStackTrace();
//        }
//        //返回一个图片名
//        return R.success(id);
//
//    }


//   private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
//    // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
//   private String accessKeyId = "LTAI5tHBMcaVRKJVdknauKKK";
//   private String accessKeySecret = "hnuNWZKrvt8olp046sov78DlrX5m1z";
//
//    private String bucketName = "bigmok";


    @Autowired
    private AliOssProperties aliOssProperties;

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) {
//        log.info(file.toString());
        String originalFilename = file.getOriginalFilename();
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
        String fileName = UUID.randomUUID().toString() + substring;




        // 创建OSSClient实例。               /*第一个参数存储的是oss地址，第二个是oss仓库的id，第三个是密钥*/
        OSS ossClient = new OSSClientBuilder().build(aliOssProperties.getEndpoint()
                , aliOssProperties.getAccessKeyId()
                , aliOssProperties.getAccessKeySecret());

        try {
                //通过输入流
            InputStream inputStream = file.getInputStream();
            PutObjectRequest putObjectRequest = new PutObjectRequest(aliOssProperties.getBucketName(), fileName, inputStream);
            ossClient.putObject(putObjectRequest);
        } catch (Exception oe) {
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        return R.success(fileName);
    }




    //下载
//    @GetMapping("/download")
//    public void download(String name,  HttpServletResponse response){
//        try {
//    //          新建一个字节输入流 。 路径下的图片名
//            FileInputStream inputStream = new FileInputStream(new File(basePath+name));
//    //          用字节输出流读取
//            ServletOutputStream outputStream = response.getOutputStream();
//    //          响应数据的类型是图片
//            response.setContentType("image/jpg");
//    //          建一个容器用来统计数量（获取文件传输总共的个数）
//            int len = 0;
//    //      新建一个字节数组
//            byte[] bytes = new byte[1024];
//    //                如果是-1的时候就满了
//            while ((len = inputStream.read(bytes)) != -1){
//                //写出在数组中，从0到满
//                outputStream.write(bytes,0,len);
//                //刷新
//                outputStream.flush();
//            }
//                //关闭输入流
//            outputStream.close();
//                //关闭输出流
//            inputStream.close();
//
////            IOUtils.copy(inputStream,response.getOutputStream());
//
//
//        }catch (Exception e){
//        e.printStackTrace();
//        }
//    }

    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {
//        log.info(name);

        BufferedInputStream input = null;
        OutputStream outputStream = null;

        OSS ossClient = new OSSClientBuilder().build(aliOssProperties.getEndpoint(), aliOssProperties.getAccessKeyId(), aliOssProperties.getAccessKeySecret());
        OSSObject ossObject = ossClient.getObject(aliOssProperties.getBucketName(), name);
        try {
            input = new BufferedInputStream(ossObject.getObjectContent());
            byte[] buffBytes = new byte[1024];
            outputStream = response.getOutputStream();
            int read = 0;
            while ((read = input.read(buffBytes)) != -1) {
                outputStream.write(buffBytes, 0, read);
            }
            outputStream.flush();
            // 数据读取完成后，获取的流必须关闭，否则会造成连接泄漏，导致请求无连接可用，程序无法正常工作。
            ossObject.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
                if (input != null) {
                    input.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        ossClient.shutdown();
    }

}
